package com.example.satokendemospringboot.config;

import cn.dev33.satoken.interceptor.SaInterceptor;
import cn.dev33.satoken.router.SaRouter;
import cn.dev33.satoken.stp.StpUtil;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

//这个配置类是拦截器 鉴权配置类
//还可以用aop 鉴权 但是不可以同时使用 如果依赖以下 那么你需要删除本类 否则会鉴权两次
//        <dependency>
//            <groupId>cn.dev33</groupId>
//            <artifactId>sa-token-spring-aop</artifactId>
//            <version>1.37.0</version>
//        </dependency>
@Configuration
public class SaTokenConfigure implements WebMvcConfigurer {
    // 注册 Sa-Token 拦截器，打开注解式鉴权功能
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 注册 Sa-Token 拦截器，定义详细认证规则
        registry.addInterceptor(new SaInterceptor(handler -> {
            // 指定一条 match 规则 这里是拦截了所有请求 只放行 /acc/doLogin 其他请求都需要登录后才能访问
            // 测试方式 找到 LoginController 类 把里面的接口都跑一遍即可
            SaRouter
                    .match("/**")    // 拦截的 path 列表，可以写多个 */
                    .notMatch("/acc/doLogin")        // 排除掉的 path 列表，可以写多个
                    .check(r -> StpUtil.checkLogin());        // 要执行的校验动作，可以写完整的 lambda 表达式

            // 角色校验 -- 拦截以 admin 开头的路由，必须具备 admin 角色才可以通过认证
            SaRouter.match("/admin/**", r -> StpUtil.checkRole("admin"));
            SaRouter.match("/**","/acc/doLogin", r -> StpUtil.checkRole("user"));


            // 角色校验 -- 拦截以 admin 开头的路由，必须具备 admin 角色或者 super-admin 角色才可以通过认证
//            SaRouter.match("/admin/**", r -> StpUtil.checkRoleOr("admin", "super-admin"));

            // 角色校验 -- 拦截以 admin 开头的路由，必须具备 admin 角色和 super-admin 角色同时满足才可以通过认证
//            SaRouter.match("/admin/**", r -> StpUtil.checkRoleAnd("admin", "super-admin"));

            // 根据路由划分模块，不同模块不同鉴权 下面是对权限的校验
//            SaRouter.match("/user/**", r -> StpUtil.checkPermissionOr("user:*"));
//            SaRouter.match("/admin/**", r -> StpUtil.checkPermission("admin"));
//            SaRouter.match("/goods/**", r -> StpUtil.checkPermission("goods"));
//            SaRouter.match("/orders/**", r -> StpUtil.checkPermission("orders"));
//            SaRouter.match("/notice/**", r -> StpUtil.checkPermission("notice"));
//            SaRouter.match("/comment/**", r -> StpUtil.checkPermission("comment"));
        })).addPathPatterns("/**");
    }


    //这里是用编码的形式配置 编码比配置文件优先级高
//    @Bean
//    @Primary
//    public SaTokenConfig getSaTokenConfigPrimary() {
//        SaTokenConfig config = new SaTokenConfig();
//        config.setTokenName("satoken");             // token 名称（同时也是 cookie 名称）
//        config.setTimeout(30 * 24 * 60 * 60);       // token 有效期（单位：秒），默认30天，-1代表永不过期
//        config.setActiveTimeout(-1);              // token 最低活跃频率（单位：秒），如果 token 超过此时间没有访问系统就会被冻结，默认-1 代表不限制，永不冻结
//        config.setIsConcurrent(true);               // 是否允许同一账号多地同时登录（为 true 时允许一起登录，为 false 时新登录挤掉旧登录）
//        config.setIsShare(true);                    // 在多人登录同一账号时，是否共用一个 token （为 true 时所有登录共用一个 token，为 false 时每次登录新建一个 token）
//        config.setTokenStyle("uuid");               // token 风格
//        config.setIsLog(false);                     // 是否输出操作日志
//        return config;
//    }
}
